package fr.expdev.bndd;

import java.util.List;

import android.app.Dialog;
import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;

import fr.expdev.bndd.data.Post;
import fr.expdev.bndd.data.PostsAsyncTask;
import greendroid.app.GDActivity;
import greendroid.widget.ActionBarItem;
import greendroid.widget.ItemAdapter;
import greendroid.widget.LoaderActionBarItem;
import greendroid.widget.ActionBar.Type;
import greendroid.widget.item.Item;
import greendroid.widget.item.ThumbnailItem;

public class Main extends GDActivity {
	
	/**
	 * TAG pour le logger
	 */
	private static final String TAG = "Main";
	
	/**
	 * Widget ListView qui presente les posts
	 */
	private ListView listView;
	
	/**
	 * Adapter pour la liste de posts
	 */
	private final ItemAdapter adapter = new ItemAdapter(this);
	
	/**
	 * Item de l'ActionBar
	 * Il s'agit de l'item de refresh
	 */
	private LoaderActionBarItem loaderItem;
	
	/**
	 * Listener qui réagit au clic sur un element de la liste
	 */
	private OnItemClickListener itemClickHandler = new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent intent = new Intent(Main.this, DetailPost.class);
            intent.putExtra("post", AppContext.getInstance().getPosts().get(position));
            startActivity(intent);
        }
    };

	public Main() {
		super(Type.Dashboard);
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
        setActionBarContentView(R.layout.list);
        
        addActionBarItem(ActionBarItem.Type.Refresh);
        
        loaderItem = (LoaderActionBarItem)getActionBar().getItem(0);
        
		// Si on vient de créer l'Activity (pas juste une rotation de l'écran)
		if (AppContext.getInstance().getPosts().size() == 0) {
			Item waitingItem = new ThumbnailItem("Chargement...", "Veuillez patienter", Post.Type.LOADING.getResource());
			waitingItem.enabled = false;
			adapter.add(waitingItem);
			
			// On charge les posts
			reloadPosts();
			
		} else {

			// On rafraichit l'adapter
			refreshAdapter();
			
		}
		
        listView = (ListView) findViewById(android.R.id.list);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(itemClickHandler);

	}

	/**
	 * Clic sur l'ActionBar
	 */
	@Override
	public boolean onHandleActionBarItemClick(ActionBarItem item, int position) {
		switch (position) {
			case 0 : 
				reloadPosts();
				break;
			default: return super.onHandleActionBarItemClick(item, position);
		}
		return true;
	}

	/**
	 * Methode appelee a la fin de l'application
	 * Elle Kill le processus pour liberer la memoire
	 */
	@Override
	public void finish() {
		super.finish();
		System.exit(RESULT_OK);
	}

	/**
	 * Creation du menu
	 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater menuInflater = getMenuInflater();
		menuInflater.inflate(R.menu.rssmenu, menu);
		return true;
	}

	/**
	 * Methode de callback appelee apres la selection d'un element du menu
	 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
			case R.id.menu_refresh:
				reloadPosts();
				return true;
				
			case R.id.menu_infos:
				final Dialog infosDialog = new Dialog(this);
				infosDialog.setTitle("Infos de l'application");
				infosDialog.setContentView(R.layout.infos_dialog);
				
				String versionName;
				try {
					versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
				} catch (NameNotFoundException e) {
					versionName = "non-défini";
					e.printStackTrace();
				}
				final String content = String.format(getString(R.string.infos_changelog), versionName);
				
				((WebView)infosDialog.findViewById(R.id.infos_dialog_changelog)).loadDataWithBaseURL(
						"http://www.experience-developpement.fr/", 
						content, 
						"text/html", 
						"utf-8", 
						"about:blank"
				);

				infosDialog.show();
				return true;
		}
		return false;
	}

	/*@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		Intent intent = new Intent(Main.this, DetailPost.class);
		intent.putExtra("post_number", position);
		intent.addFlags(Intent.FLAG_FROM_BACKGROUND);
		startActivity(intent);
	}*/

	/**
	 * (Re)lance le chargement des posts sur le site
	 */
	private void reloadPosts() {
		loaderItem.setLoading(true);
		PostsAsyncTask task = new PostsAsyncTask(this);
		task.execute("http://www.experience-developpement.fr/feed/");
	}

	/**
	 * Methode de callback pour le chargement asychrone des posts
	 * @param posts
	 */
	public void notifyNewPosts(List<Post> posts) {
		if (posts.size() == 0) {
			Log.e(TAG, "Aucun article n'a été chargé");
		}
		
		AppContext application = AppContext.getInstance();
		application.getPosts().clear();
		application.getPosts().addAll(posts);
		
		// On actualise l'affichage
		refreshAdapter();
		
		loaderItem.setLoading(false);
	}

	/**
	 * Rafraichir l'affichage des posts avec les Posts de l'AppContext
	 */
	public void refreshAdapter() {
		adapter.clear();
		for(Post post : AppContext.getInstance().getPosts()) {
			adapter.add(new ThumbnailItem(post.getTitle(), "", post.getType().getResource()));
		}
		adapter.notifyDataSetChanged();
	}
}